package ga.operadores.mutacao;

import ga.base.Individuo;
import ga.base.OperadorMutacao;

import java.util.List;

import problema.Problema;
import problema.Solucao;
import util.MersenneTwister;

public class MutacaoLimite implements OperadorMutacao {

	@Override
	public int executar(List<Solucao> populacao, Problema problema) {
		MersenneTwister random = new MersenneTwister();
		
		int indiceSorteado = random.nextInt(populacao.size());
		Individuo individuo = (Individuo) populacao.get(indiceSorteado);
		
		int dimensaoSorteada = random.nextInt(individuo.getGene().length);
		
		double[] gene = individuo.getGene();
		
		double[] menorValor = problema.getValorMinimo();
		double[] maiorValor = problema.getValorMaximo();
		
		int numeroSorteadoParaLimite = random.nextInt(2);
		
		if(numeroSorteadoParaLimite % 2 == 0){
			gene[dimensaoSorteada] = menorValor[dimensaoSorteada];
		}else{
			gene[dimensaoSorteada] = maiorValor[dimensaoSorteada];
		}

		individuo.setGene(gene);
		
		return indiceSorteado;
	}

}
